package com.domus.dreamMenu.servidor.negocios;

import com.domus.dreamMenu.servidor.repositorios.Repositorio;
import com.domus.dreamMenu.servidor.util.Notificador;
import com.domus.dreamMenu.servidor.util.RegistroObserver;
import com.domus.dreamMenu.servidor.util.RepositorioObserver;

/**
 * 
 * @author elihimas
 *
 * @param <ClasseDados> 
 * @param <ClasseChave>
 */
public abstract class NegociosAbstrato 
	<TipoRepositorio extends Repositorio<ClasseDados, ClasseChave>,
		ClasseDados, ClasseChave>{
	
	protected RepositorioObserver observers;
	protected TipoRepositorio repositorio;

	/**
	 * Metodo onde as sub classes devem criar o singleton e qualquer código de inicialização
	 * @return o singleton da subclasse, já inicializado
	 */
	public static NegociosAbstrato getInstancia(){
		assert(false);//as subclasses devem sobrescrever este método 
		throw new RuntimeException("as subclasses devem sobrescrever este método");
	}

	public void registrarObserver(Notificador notificador) {
		this.observers.registrar(notificador);
	}

	public void removerObserver(Notificador notificador) {
		this.observers.retirarRegistro(notificador);
	}

	protected void notificarObservers() {
		this.observers.notificarObservers();
	}

	public void adicionarEntrada(ClasseDados novo) {
		this.repositorio.inserir(novo);
		
		this.notificarObservers();
	}

	public void alterarEntrada(ClasseDados novo, ClasseChave chave) {
		this.repositorio.alterar(novo, chave);
		
		this.notificarObservers();
	}

	public void removerEntrada(ClasseChave chave) {
		this.repositorio.remover(chave);
		
		this.notificarObservers();
	}

	protected TipoRepositorio acessarRepositorio(){
		return this.repositorio;
	}
}